package com.io.netty.codec;

import io.netty.buffer.Unpooled;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.ChannelInboundHandlerAdapter;
import io.netty.util.CharsetUtil;

//ChannelInboundHandlerAdapter这个handler与SimpleChannelInboundHandler<>不同的是
//后面这个带的有数据穿过来的泛型前面那个没有
public class NettyServerHandler extends ChannelInboundHandlerAdapter {

    //读取数据事件(这里我们可以读取客户端发送的消息)
    /*
    1. ChannelHandlerContext ctx:上下文对象, 含有 管道pipeline , 通道channel, 地址
    2. Object msg: 就是客户端发送的数据 默认Object
     */
    public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
        StudentPOJO.Student pojo= (StudentPOJO.Student) msg;
        //生成java文件时就为每个属性都提供了set和get方法
        System.out.println("id为："+pojo.getId()+"名字为："+pojo.getName());
        System.out.println("read执行完了");
    }

    //数据读取完毕，即channelRead方法执行完毕，才会执行channelReadComplete方法
    public void channelReadComplete(ChannelHandlerContext ctx) throws Exception {

        //writeAndFlush 是 write + flush
        //将数据写入到缓存，并刷新（刷新就是把缓冲区中的数据写到通道中）
        //一般讲，我们对这个发送的数据进行编码
        System.out.println("readComplete开始执行");
        ctx.writeAndFlush(Unpooled.copiedBuffer("hello, 客户端~(>^ω^<)喵1", CharsetUtil.UTF_8));
    }

    //处理异常, 一般是需要关闭通道
    public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {
        //cf.channel().closeFuture().sync()监听的就是这个命令，当这个ctx.close()命令发出后
        // cf.channel().closeFuture().sync()命令就会将通道关闭
        ctx.close();
    }
}
